#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M;
vector<int> a;
int main() {
    cin >> N >> M;
    for(int i = 0; i < N; i++) {
        int temp;
        cin >> temp;
        a.push_back(temp);
    }
    for(int i = 0; i < M; i++) {
        next_permutation(a.begin(), a.end());
    }
    for(auto& s : a) {
        cout << s << " ";
    }
    return 0;
}



// 通用写法，康托展开
// #include <iostream>
// #include <vector>
// #include <algorithm>
// using namespace std;

// typedef long long ll;
// const int MAX = 10005;
// ll factorial[21]; // 只需要 20! 足够应付 M 次 next_permutation

// // 预处理阶乘
// void init_factorial() {
//     factorial[0] = 1;
//     for (int i = 1; i <= 20; ++i)
//         factorial[i] = factorial[i - 1] * i;
// }

// // 计算排列的康托展开值（字典序第几小，1-based）
// ll cantor_rank(vector<int>& a) {
//     int n = a.size();
//     vector<bool> used(n + 1, false);
//     ll rank = 1; // 从1开始

//     for (int i = 0; i < n; ++i) {
//         int cnt = 0;
//         for (int j = 1; j < a[i]; ++j) {
//             if (!used[j]) cnt++;
//         }
//         rank += cnt * factorial[n - 1 - i];
//         used[a[i]] = true;
//     }
//     return rank;
// }

// // 给定 rank，反推回字典序第 rank 小的排列（1-based）
// vector<int> reverse_cantor(int n, ll rank) {
//     vector<int> a;
//     vector<int> nums(n);
//     for (int i = 0; i < n; ++i) nums[i] = i + 1;
//     rank--; // 转换为0-based

//     for (int i = n - 1; i >= 0; --i) {
//         ll f = factorial[i];
//         int idx = rank / f;
//         a.push_back(nums[idx]);
//         nums.erase(nums.begin() + idx);
//         rank %= f;
//     }
//     return a;
// }

// int main() {
//     int N, M;
//     cin >> N >> M;

//     init_factorial(); // 只初始化 20!，M 最多100次排列，够用

//     vector<int> a(N);
//     for (int i = 0; i < N; ++i) cin >> a[i];

//     // 处理：只在前 20 位做康托，后面部分不动
//     int fixed_len = min(20, N);

//     vector<int> sub_a(a.begin(), a.begin() + fixed_len);
//     ll rank = cantor_rank(sub_a);
//     ll new_rank = rank + M;

//     // 反推前 fixed_len 个数的新排列
//     vector<int> new_sub = reverse_cantor(fixed_len, new_rank);

//     // 拼接回原始数组
//     for (int i = 0; i < fixed_len; ++i) a[i] = new_sub[i];

//     // 输出
//     for (int i = 0; i < N; ++i) {
//         cout << a[i];
//         if (i != N - 1) cout << " ";
//     }
//     cout << endl;

//     return 0;
// }
